package cn.quevo.cube.provide.data.validate.impl;


import cn.quevo.common.lang.DateFormatUtils;
import cn.quevo.common.lang.DateUtils;
import cn.quevo.cube.provide.data.entity.dto.ColumnValidateDto;
import cn.quevo.cube.provide.data.enums.DateFormatConvert;
import cn.quevo.cube.provide.data.tools.DateConvertFormatTools;
import cn.quevo.cube.provide.data.validate.AbstractColumnDataValidate;
import cn.quevo.cube.provide.data.validate.ColumnDataValidate;
import cn.quevo.cube.provide.exception.ColumnCheckException;
import cn.quevo.cube.provide.exception.response.ColumnExceptionResponse;

/**
 * 日期验证
 *
 * @author July july_sky@foxmail.com
 * @version 1.0
 * @date 2018/12/14 6:47 PM
 * @Copyright 湘豫（北京）科技有限公司版权所有.All Rights Reserved.
 */
public class DateValidate extends AbstractColumnDataValidate implements ColumnDataValidate {

    @Override
    protected void checked(ColumnValidateDto columnValidateDto) {
        String[] args = columnValidateDto.getValue().split(" ");
        if (args.length > 2) {
            throw new ColumnCheckException(ColumnExceptionResponse.DATE_FORMATER_FAILD);
        }
        try {
            args[0] = DateConvertFormatTools.convertDate(args[0]);
            DateFormatConvert format = DateFormatConvert.valueOf(columnValidateDto.getFormatter().toUpperCase());
            if (format == DateFormatConvert.YMD || args.length == 1) {
                if (!DateUtils.isDate(args[0], format.getCode())) {
                    throw new ColumnCheckException(ColumnExceptionResponse.DATE_FORMATER_FAILD);
                }
                columnValidateDto.setValue(args[0]);
                columnValidateDto.setRealValue(DateFormatUtils.parse(columnValidateDto.getValue(), format.getCode()));
                return;
            }
            args[1] = DateConvertFormatTools.convertTime(args[1]);
            if (!DateUtils.isDate(args[0].concat(" ").concat(args[1]), format.getCode())) {
                throw new ColumnCheckException(ColumnExceptionResponse.DATE_FORMATER_FAILD);
            }
            columnValidateDto.setValue(args[0].concat(" ").concat(args[1]));
            columnValidateDto.setRealValue(DateFormatUtils.parse(columnValidateDto.getValue(), format.getCode()));
        } catch (Exception e) {
            throw new ColumnCheckException(e, ColumnExceptionResponse.DATE_FORMATER_FAILD);
        }
    }
}
